package com.bitoon.basketdudes.web.admin;

import javax.persistence.*;
import com.bitoon.basketdudes.web.*;
import com.bitoon.basketdudes.web.datos.*;
import com.bitoon.basketdudes.web.jpa.Partido;
import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import org.apache.log4j.Logger;


public class ListaPartidoAdmin extends DetallePartido {

    private String tipo;                //id ó fecha-Manager ó fecha-equipo
    private String input;               //lo que haya escrito el usuario en la combinacion id/fecha-Manager/fecha-equipo
    private String fecha_ini;           //inicio de intervalo fecha
    private String fecha_final;         //fin del intervalo de la fecha

    private List<Partido> datos;        //resultados de la búsqueda
    private InfoCabeceraXHR cabecera;
    private int pagina = 1;
    private int cuantos;

    //usamos las constantes de baseactions LISTADO_RESULTADOS para paginar

    private Logger log = Logger.getLogger(ListaPartidoAdmin.class);

    //acceso a la clase estatica BaseActionAdmin
    protected BaseActionAdmin bsaadmin = BaseActionAdmin.getInstance();

    @Override
    public String execute() {
        String retorno = SUCCESS;
        
        log.debug("buscando partido execute, por parametro: " + getTipo() + " input: " + input);
        
        //si se pasa un parámetro
        if(getTipo()!=null){
            //si busca por id de partido
            if(getTipo().compareTo("id")==0){
                try{
                    int num = Integer.parseInt(input);
                    setIdPartido(input);
                    retorno = super.buscarPartido();
                }catch(Exception e){ log.error("[listaPartidosAdmin] Error, id no es numero"); }
            }
            if(cuantos==0){
                cuantos = LISTADO_RESULTADOS_ELEMENTOS_POR_PAGINA;
            }
             //si busca por fecha/manager ó si busca por fecha/manager
            if((getTipo().compareTo("manager")==0 || getTipo().compareTo("equipo")==0) && fecha_ini.compareTo("")!=0){
                buscarPartidosFechaME(cuantos,LISTADO_RESULTADOS_HUECOS_LADO_PAGINA);
            }else{
                buscarPartidos(cuantos,LISTADO_RESULTADOS_HUECOS_LADO_PAGINA);
            }
        }

        return retorno;
    }

    public void buscarPartidosFechaME(int elementos, int huecos)
    {
        List<Partido> retorno = null;
        EntityManager em = null;

        try {
            if(fecha_ini!=null && fecha_final!=null)
            {
                //si no se indican fechas las componemos nosotros
                String finicio ="";
                if(fecha_ini.compareTo("")==0){
                    log.debug("[fecha ini]"+getFecha_ini());
                    finicio = dameTimestamp("01/01/2000").toString();
                }else{
                    finicio = getFecha_ini();
                }

                String ffinal ="";
                if(fecha_final.compareTo("")==0){
                    DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
                    Date date = new Date();
                    ffinal = dateFormat.format(date);
                    log.debug("[fecha final]"+getFecha_ini());
                }else{
                    ffinal = fecha_final;
                }

                log.debug("[buscarPartidosFechaME]: fecha_ini: " + fecha_ini + " fecha_fin: " + fecha_final);
                retorno = new ArrayList<Partido>();

                em = bsaadmin.getEmfAdmin().createEntityManager(); // checked

                Query q = null;
                
                log.debug("[buscarPartidosFechaME]" + (getTipo().compareTo("equipo")==0) + (getTipo().compareTo("manager")==0));

                if(getTipo().compareTo("equipo")==0){
                    //buscar por fecha/Equipo
                    log.debug("Entro consulta Equipo");
                    q = em.createNamedQuery("Partido.findByFechaEquipo");
                    q.setParameter("fecha_ini", dameTimestamp(finicio));
                    q.setParameter("fecha_fin", dameTimestamp(ffinal));
                    q.setParameter("nombre","%"+ input.toLowerCase()+"%");

                }else{
                    //buscar por fecha/nick manager
                    log.debug("Entro consulta Manager");
                    q = em.createNamedQuery("Partido.findByFechaManager");
                    q.setParameter("fecha_ini", dameTimestamp(finicio));
                    q.setParameter("fecha_fin", dameTimestamp(ffinal));
                    q.setParameter("nick", "%"+input.toLowerCase()+"%");
                }

                int totalRegistros = q.getResultList().size();
                //log.debug("totalRegistros: " + totalRegistros);
                int totalPaginas = (totalRegistros-1)/elementos + 1;

                int offset = (pagina-1) * elementos;
                int first = (pagina-1)*elementos; //primer registro
                int max = elementos; //ultimo registro

                if(getTipo().compareTo("equipo")==0){
                    //buscar por fecha/Equipo
                    log.debug("Entro consulta Equipo");
                    q = em.createNamedQuery("Partido.findByFechaEquipo");
                    q.setParameter("fecha_ini", dameTimestamp(finicio));
                    q.setParameter("fecha_fin", dameTimestamp(ffinal));
                    q.setParameter("nombre", "%"+input.toLowerCase()+"%");
                }else{
                    //buscar por fecha/nick manager
                    log.debug("Entro consulta Manager");
                    q = em.createNamedQuery("Partido.findByFechaManager");
                    q.setParameter("fecha_ini", dameTimestamp(finicio));
                    q.setParameter("fecha_fin", dameTimestamp(ffinal));
                    q.setParameter("nick", "%"+input.toLowerCase()+"%");
                }
                
                q.setFirstResult(first);
                q.setFirstResult(offset);
                q.setMaxResults(max);

                retorno = (List<Partido>)q.getResultList();

                log.debug("retorno: " + retorno.size());

                cabecera = new InfoCabeceraXHR();
                cabecera.setCorrecto(1);
                cabecera.setActual(pagina);
                cabecera.setTotal(totalPaginas);
                cabecera.setTotalRegistros(totalRegistros);

                int p1=0, p2=0;

                if (pagina <= (huecos+1)) {
                    p1 = 1;
                    p2 = huecos*2 + 1;
                } else if (pagina >= (totalPaginas-huecos)) {
                    p1 = totalPaginas - (huecos*2);
                    p2 = totalPaginas;
                } else {
                    p1 = pagina - huecos;
                    p2 = pagina + huecos;
                }
                if (p1 < 1) {
                    p1 = 1;
                }
                if (p2 > totalPaginas) {
                    p2 = totalPaginas;
                }
                cabecera.setPrimeraPagina(p1);
                cabecera.setUltimaPagina(p2);

                setDatos(retorno);
                setCabecera(cabecera);               
            }
        } catch (Exception e) {
            log.error("[buscarPartidosFechaME] Error", e);
        } finally {
            try { em.close(); } catch (Exception e) { }
        }
    }

    private Timestamp dameTimestamp(String fecha){
        Timestamp t = null;
        try {
            DateFormat formatter;
            Date date;
            formatter = new SimpleDateFormat("dd/MM/yyyy");
            date = (Date)formatter.parse(fecha);
            t = new Timestamp(date.getTime());
            log.error("[dameTimestamp] La fecha inicial es:  " + fecha + " fecha convertida:" + t);
        }catch (ParseException e){
            log.error("[dameTimestamp] Excepcion: ", e);
        }
        return t;
    }

    public void buscarPartidos(int elementos, int huecos)
    {
        List<Partido> retorno = null;
        EntityManager em = null;

        try {
            retorno = new ArrayList<Partido>();

            em = bsaadmin.getEmfAdmin().createEntityManager(); // checked

            Query q = null;

            log.debug("[buscarPartidos]" + (getTipo().compareTo("equipo")==0) + (getTipo().compareTo("manager")==0));

            if(getTipo().compareTo("equipo")==0){
                //buscar por fecha/Equipo
                log.debug("Entro consulta Equipo");
                q = em.createNamedQuery("Partido.findByEquipoNombre");
                q.setParameter("nombre", "%"+input.toLowerCase()+"%");

            }else{
                //buscar por fecha/nick manager
                log.debug("Entro consulta Manager");
                q = em.createNamedQuery("Partido.findByManagerNick");
                q.setParameter("nick", "%"+input.toLowerCase()+"%");
            }

            int totalRegistros = q.getResultList().size();
            //log.debug("totalRegistros: " + totalRegistros);
            int totalPaginas = (totalRegistros-1)/elementos + 1;

            int offset = (pagina-1) * elementos;
            int first = (pagina-1)*elementos; //primer registro
            int max = elementos; //ultimo registro

            if(getTipo().compareTo("equipo")==0){
                //buscar por fecha/Equipo
                log.debug("Entro consulta Equipo");
                q = em.createNamedQuery("Partido.findByEquipoNombre");
                q.setParameter("nombre", "%"+input.toLowerCase()+"%");
            }else{
                //buscar por fecha/nick manager
                log.debug("Entro consulta Manager");
                q = em.createNamedQuery("Partido.findByManagerNick");
                q.setParameter("nick", "%"+input.toLowerCase()+"%");
            }

            q.setFirstResult(first);
            q.setFirstResult(offset);
            q.setMaxResults(max);

            retorno = (List<Partido>)q.getResultList();

            log.debug("retorno: " + retorno.size());

            cabecera = new InfoCabeceraXHR();
            cabecera.setCorrecto(1);
            cabecera.setActual(pagina);
            cabecera.setTotal(totalPaginas);
            cabecera.setTotalRegistros(totalRegistros);

            int p1=0, p2=0;

            if (pagina <= (huecos+1)) {
                p1 = 1;
                p2 = huecos*2 + 1;
            } else if (pagina >= (totalPaginas-huecos)) {
                p1 = totalPaginas - (huecos*2);
                p2 = totalPaginas;
            } else {
                p1 = pagina - huecos;
                p2 = pagina + huecos;
            }
            if (p1 < 1) {
                p1 = 1;
            }
            if (p2 > totalPaginas) {
                p2 = totalPaginas;
            }
            cabecera.setPrimeraPagina(p1);
            cabecera.setUltimaPagina(p2);

            setDatos(retorno);
            setCabecera(cabecera);

        } catch (Exception e) {
            log.error("[buscarPartidos] Error", e);
        } finally {
            try { em.close(); } catch (Exception e) { }
        }
    }

    public String consultaXhr(){
        String retorno = SUCCESS;

        if(getTipo()!=null){
            log.debug("[consultaXhr] cuantos: " + cuantos);
            if(cuantos==0){
                cuantos = LISTADO_RESULTADOS_ELEMENTOS_POR_PAGINA;
            }
             //si busca por fecha/manager ó si busca por fecha/manager
            if((getTipo().compareTo("manager")==0 || getTipo().compareTo("equipo")==0)
                && fecha_ini!=null && fecha_ini.compareTo("")!=0){
                buscarPartidosFechaME(cuantos,LISTADO_RESULTADOS_HUECOS_LADO_PAGINA);
            }else{
                try{
                    //si el input es un id, es buscar un equipo por id,si da excepcion buscamos por cadena
                    int id = Integer.parseInt(input);
                    buscarPartidosEquipoId(cuantos, LISTADO_RESULTADOS_HUECOS_LADO_PAGINA,id);  
                }catch (Exception e) {
                    buscarPartidos(cuantos, LISTADO_RESULTADOS_HUECOS_LADO_PAGINA);
                }
            }
        }

        return retorno;
    }

    public void buscarPartidosEquipoId(int elementos, int huecos,int id)
    {
        List<Partido> retorno = null;
        EntityManager em = null;

        try {
            retorno = new ArrayList<Partido>();

            em = bsaadmin.getEmfAdmin().createEntityManager(); // checked

            Query q = null;

            log.debug("[buscarPartidos]" + (getTipo().compareTo("equipo")==0));

            if(getTipo().compareTo("equipo")==0){
                //buscar por fecha/Equipo
                log.debug("Entro consulta Equipo");
                q = em.createNamedQuery("Partido.findByEquipoId");
                q.setParameter("equipoId", id);
            }

            int totalRegistros = q.getResultList().size();
            int totalPaginas = (totalRegistros-1)/elementos + 1;

            int offset = (pagina-1) * elementos;
            int first = (pagina-1)*elementos; //primer registro
            int max = elementos; //ultimo registro

            if(getTipo().compareTo("equipo")==0){
                //buscar por fecha/Equipo
                log.debug("Entro consulta Equipo");
                q = em.createNamedQuery("Partido.findByEquipoId");
                q.setParameter("equipoId", id);
            }

            q.setFirstResult(first);
            q.setFirstResult(offset);
            q.setMaxResults(max);

            retorno = (List<Partido>)q.getResultList();

            log.debug("retorno: " + retorno.size());

            cabecera = new InfoCabeceraXHR();
            cabecera.setCorrecto(1);
            cabecera.setActual(pagina);
            cabecera.setTotal(totalPaginas);
            cabecera.setTotalRegistros(totalRegistros);

            int p1=0, p2=0;

            if (pagina <= (huecos+1)) {
                p1 = 1;
                p2 = huecos*2 + 1;
            } else if (pagina >= (totalPaginas-huecos)) {
                p1 = totalPaginas - (huecos*2);
                p2 = totalPaginas;
            } else {
                p1 = pagina - huecos;
                p2 = pagina + huecos;
            }
            if (p1 < 1) {
                p1 = 1;
            }
            if (p2 > totalPaginas) {
                p2 = totalPaginas;
            }
            cabecera.setPrimeraPagina(p1);
            cabecera.setUltimaPagina(p2);

            setDatos(retorno);
            setCabecera(cabecera);

        } catch (Exception e) {
            log.error("[buscarPartidos] Error", e);
        } finally {
            try { em.close(); } catch (Exception e) { }
        }
    }

    public String getInput() {
        return input;
    }

    public void setInput(String input) {
        this.input = input;
    }

    public String getFecha_ini() {
        return fecha_ini;
    }

    public void setFecha_ini(String fecha_ini) {
        this.fecha_ini = fecha_ini;
    }

    public String getFecha_final() {
        return fecha_final;
    }

    public void setFecha_final(String fecha_fin) {
        this.fecha_final = fecha_fin;
    }

    public List<Partido> getDatos() {
        return datos;
    }

    public void setDatos(List<Partido> datos) {
        this.datos = datos;
    }
    
    @Override
    public int getPagina() {
        return pagina;
    }

    @Override
    public void setPagina(int pagina) {
        this.pagina = pagina;
    }

    public int getCuantos() {
        return cuantos;
    }

    public void setCuantos(int cuantos) {
        this.cuantos = cuantos;
    }

    public String getTipo() {
        return tipo;
    }

    public void setTipo(String tipo) {
        this.tipo = tipo;
    }

    public BaseActionAdmin getBsaadmin() {
        return bsaadmin;
    }

    public void setBsaadmin(BaseActionAdmin bsaadmin) {
        this.bsaadmin = bsaadmin;
    }

}
